﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json;

namespace Main.Packets
{
    /// <summary>
    /// Paquet de libération
    /// </summary>
    public class FreeConnectionPacket : Packet
    {
        private byte adresseSource;
        private byte adresseDestination;
        private Raisons raison;

        private FreeConnectionPacket(byte numeroConnexion, PacketType type, byte adresseSource, byte adresseDestination, Raisons raison)
            : base(numeroConnexion, type)
        {
            this.adresseSource = adresseSource;
            this.adresseDestination = adresseDestination;
            this.raison = raison;
        }

        #region Propriétés

        [JsonProperty(Order = 10)]
        public byte AdresseSource
        {
            get { return adresseSource; }
            set { adresseSource = value; }
        }

        [JsonProperty(Order = 20)]
        public byte AdresseDestination
        {
            get { return adresseDestination; }
            set { adresseDestination = value; }
        }

        [JsonProperty(Order = 30)]
        public Raisons Raison
        {
            get { return raison; }
            set { raison = value; }
        }

        #endregion

        /// <summary>
        /// Instanciation d'un paquet d'indication de libération.
        /// </summary>
        public static FreeConnectionPacket CreateFreeConnectionIndicationPacket(byte numeroConnexion, byte adresseSource, byte adresseDestination, Raisons raison)
        {
            FreeConnectionPacket freeConnectionPacket = new FreeConnectionPacket(numeroConnexion, PacketType.CreateTypeForFreeConnectionPacket(), adresseSource, adresseDestination, raison);
            return freeConnectionPacket;
        }

        /// <summary>
        /// Instanciation d'un paquet de demande de libération.
        /// </summary>
        public static FreeConnectionPacket CreateFreeConnectionRequestPacket(byte numeroConnexion, byte adresseSource, byte adresseDestination)
        {
            FreeConnectionPacket freeConnectionPacket = new FreeConnectionPacket(numeroConnexion, PacketType.CreateTypeForFreeConnectionPacket(), adresseSource, adresseDestination, Raisons.None);
            return freeConnectionPacket;
        }

        /// <summary>
        /// Instanciation d'un paquet de libération (demande ou indication) à partir d'une ligne reçu d'une couche supérieure ou inférieure
        /// </summary>
        public static FreeConnectionPacket CreateFreeConnectionPacket(string str)
        {
            return JsonConvert.DeserializeObject<FreeConnectionPacket>(str) as FreeConnectionPacket;
        }

        /// <summary>
        /// Envoie d'un paquet de libération (demande ou indication) vers le flux passé en paramètre.
        /// </summary>
        public override void Send(System.IO.StreamWriter sw)
        {
            sw.WriteLine(JsonConvert.SerializeObject(this));
        }

        public override string ToString()
        {
            return base.ToString() + "Adresse source : " + this.adresseSource + "adresse destination : " + this.adresseDestination + "Raison : " + Enum.GetName(typeof(Raisons), this.raison);
        }
    }
}
